﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Web.UI.WebControls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;

namespace Emporium_Web
{
    public partial class EstiloImagenes : System.Web.UI.Page
    {
        public string SortExpression
        {
            get
            {
                return ViewState["gv_SortExpression"] == null ? "" : ViewState["gv_SortExpression"].ToString();
            }
            set
            {
                ViewState["gv_SortExpression"] = value;
            }
        }

        public string SortDirection
        {
            get
            {
                return ViewState["gv_SortDirection"] == null ? "" : ViewState["gv_SortDirection"].ToString();
            }
            set
            {
                ViewState["gv_SortDirection"] = value;
            }
        }

        /// <summary>
        /// Es el código de estilo
        /// </summary>
        private int EstiloId
        {
            get { return ViewState["RequestCodeEstilo"] == null ? -1 : (int)ViewState["RequestCodeEstilo"]; }
            set { ViewState["RequestCodeEstilo"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        } 

        /// <summary>
        /// Las Imagenes del estilo.
        /// </summary>
        private List<Imagen> Imagenes
        {
            get
            {
                return ViewState["TG_EstiloImagenes"] == null ? null : (List<Imagen>)ViewState["TG_EstiloImagenes"];
            }
            set
            {
                ViewState["TG_EstiloImagenes"] = value;
            }
        }
      

        /// <summary>
        /// Las imagenes que se le agregan al estilo.
        /// </summary>
        private List<Imagen> ImagenesNuevas
        {
            get
            {
                return ViewState["TG_ImagenesNuevas"] == null ? null : (List<Imagen>)ViewState["TG_ImagenesNuevas"];
            }
            set
            {
                ViewState["TG_ImagenesNuevas"] = value;
            }
        }

        /// <summary>
        /// Las imagenes que se eliminan del estilo.
        /// </summary>
        private List<int> ImagenesEliminadas
        {
            get
            {
                return ViewState["TG_ImagenesEliminadas"] == null ? null : (List<int>)ViewState["TG_ImagenesEliminadas"];
            }
            set
            {
                ViewState["TG_ImagenesEliminadas"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;
                    warningMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Desarrollo, (int)MenuDesarrollo.Estilo);

                    Master.AgregarBreadcrumb("Estilos", "#", true);
                    Master.AgregarBreadcrumb("Imagenes", "EstiloImagenes.aspx", false);

                    int estiloId = 0;

                    if (Request.QueryString["EstiloId"] != null && Int32.TryParse(Request.QueryString["EstiloId"], out estiloId))
                    {
                        this.EstiloId = estiloId;
                    }
                    else
                    {
                        this.EstiloId = -1;
                    }
                    LlenarDatosForm();
                    ListarImagenes();                  
                }                
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            string strResultado = string.Empty;
            try
            {
                strResultado = Grabar();

                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                }
                else
                    Response.Redirect("EstiloList.aspx");
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvImagenes_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {
                    AgregarImagen();
                    ListarImagenes();
                }
                
                if (e.CommandName.Equals("Remove"))
                {
                    EliminarImagen(e.CommandArgument.ToString());
                    ListarImagenes();
                }

                if (e.CommandName.Equals("ViewImage"))
                {
                    estiloImagenShow.ImagenesTemp = this.Imagenes;
                    estiloImagenShow.CodigoEstilo = this.EstiloId;
                    estiloImagenShow.CodigoImagen = Convert.ToInt32(e.CommandArgument.ToString());
                    estiloImagenShow.Show();   
                }                
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }
        

        /// <summary>
        /// Llena los datos del formulario con la información de las imagenes.
        /// </summary>        
        private void LlenarDatosForm()
        {
            TablasDataContext database = new TablasDataContext();

            var estilo = (from estilos in database.DE_Estilo
                           where estilos.Id == this.EstiloId
                           select estilos).First();

            if (estilo != null)
            {         
                if (this.Imagenes == null)
                {
                    this.Imagenes = new List<Imagen>();
                }

                for (int i = 0; i < estilo.DE_EstiloImagen.Count; i++)
                {
                    DE_EstiloImagen tg_imagen = estilo.DE_EstiloImagen[i];

                    this.Imagenes.Add(new Imagen
                    {
                        Id = tg_imagen.Id,
                        Descripcion = tg_imagen.Descripcion,
                        Defecto = tg_imagen.Defecto.Value,
                        Visible = tg_imagen.Visible.Value,
                        Ruta = tg_imagen.Ruta,
                        FechaRegistro = tg_imagen.FechaRegistro.Value,
                        Secuencial = i + 1,
                        EstiloId = tg_imagen.EstiloId                        
                    });
                }
            }
            else
            {
                errorMessage.Visible = true;
                lblErrorMessage.Text = Resources.MensajesValidacion.NoDataFound;
            }
        }

        /// <summary>
        /// Llena el grid de Imagenes.
        /// </summary>
        private void ListarImagenes()
        {
            if (this.Imagenes == null)
            {
                this.Imagenes = new List<Imagen>();
            }

            if (this.Imagenes.Count > 0)
            {
                gvImagenes.DataSource = this.Imagenes;
                gvImagenes.DataBind();
                gvImagenes.UseAccessibleHeader = false;
                gvImagenes.HeaderRow.TableSection = TableRowSection.TableHeader;            
            }
            else
            { 
                AgregarFilaVacia();
                LinkButton lnkEliminar = (LinkButton)gvImagenes.Rows[0].FindControl("lnkEliminar");
                lnkEliminar.Visible = false;                
            }
            
            lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, this.Imagenes.Count);
            EstablecerValidaciones();
        }      
     
        /// <summary>
        /// Agrega una fila vacía al grid de Imagenes.
        /// </summary>
        /// <param name="gv"></param>
        private void AgregarFilaVacia()
        {
            DataTable source = new DataTable();

            source.Columns.Add("Id");
            source.Columns.Add("Secuencial");
            source.Columns.Add("EstiloId");
            source.Columns.Add("Descripcion");
            source.Columns.Add("FechaRegistro");
            source.Columns.Add("Defecto");
            source.Columns.Add("Visible");
            source.Columns.Add("Ruta");

            source.Rows.Add(source.NewRow());

            gvImagenes.DataSource = source;
            gvImagenes.DataBind();
        }

        private void EliminarImagen(string ImagenSeleccionada)
        {
            if (this.ImagenesEliminadas == null)
            {
                this.ImagenesEliminadas = new List<int>();
            }

            int imagenId = 0;

            if (Int32.TryParse(ImagenSeleccionada, out imagenId))
            {
                this.ImagenesEliminadas.Add(imagenId);
                this.Imagenes = EliminaImagenDeLista(imagenId, this.Imagenes);
                this.ImagenesNuevas = EliminaImagenDeLista(imagenId, this.ImagenesNuevas);
            }
        }

        private List<Imagen> EliminaImagenDeLista(int imagenId, List<Imagen> imagenes)
        {

            if (imagenes == null)
            {
                return null;
            }

            List<Imagen> tempImagenes = new List<Imagen>();

            for (int i = 0; i < imagenes.Count; i++)
            {
                if (imagenes[i].Id != imagenId)
                {
                    tempImagenes.Add(imagenes[i]);
                }
            }

            return tempImagenes;
        }

        private void AgregarImagen()
        {
            TextBox txtDescripcion = (TextBox)gvImagenes.FooterRow.FindControl("txtDescripcion");
            CheckBox chkVisibleNuevo = (CheckBox)gvImagenes.FooterRow.FindControl("chkVisibleNuevo");
            CheckBox chkDefectoNuevo = (CheckBox)gvImagenes.FooterRow.FindControl("chkDefectoNuevo");
            EstiloImagenUpload estiloImagenUpload = (EstiloImagenUpload)gvImagenes.FooterRow.FindControl("estiloImagenUpload");
            
            if (this.ImagenesNuevas == null)
            {
                this.ImagenesNuevas = new List<Imagen>();
            }

            Imagen nuevaImagen = new Imagen
            {
                Id = Imagenes.Count + 1,
                EstiloId = this.EstiloId,
                Secuencial = Imagenes.Count + 1,
                Descripcion = txtDescripcion.Text,
                Visible = chkVisibleNuevo.Checked ? 'Y' : 'N',
                FechaRegistro = DateTime.Now,
                Defecto = chkDefectoNuevo.Checked ? 'Y' : 'N',
                Ruta = estiloImagenUpload.Ruta 
            };

            this.ImagenesNuevas.Add(nuevaImagen);
            this.Imagenes.Add(nuevaImagen);            
        }

        private string Grabar()
        {
            string strResultado = string.Empty;

            TablasDataContext database = new TablasDataContext();
            var estilo = (from estilos in database.DE_Estilo
                           where estilos.Id == this.EstiloId
                           select estilos).First();

            if (this.ImagenesNuevas != null)
            {
                for (int i = 0; i < this.ImagenesNuevas.Count; i++)
                {
                    estilo.DE_EstiloImagen.Add(new DE_EstiloImagen
                    {
                        EstiloId = this.EstiloId,
                        Descripcion = this.ImagenesNuevas[i].Descripcion,
                        Visible = this.ImagenesNuevas[i].Visible,
                        Defecto = this.ImagenesNuevas[i].Defecto,
                        Ruta = this.ImagenesNuevas[i].Ruta,
                        FechaRegistro = this.ImagenesNuevas[i].FechaRegistro                        
                    });
                }
            }

            if (estilo.DE_EstiloImagen.Count == 0
               || estilo.DE_EstiloImagen.Where(c => c.Defecto.Value == 'Y' && c.Visible.Value == 'Y').Count() == 0)
            {
                strResultado = "Ingrese al menos una imagen marcada por Defecto y Visible";
                return strResultado;
            }

            if (this.ImagenesEliminadas != null)
            {
                for (int i = 0; i < this.ImagenesEliminadas.Count; i++)
                {
                    foreach (DE_EstiloImagen item in estilo.DE_EstiloImagen)
                    {
                        if (item.Id == this.ImagenesEliminadas[i])
                        {
                            database.DE_EstiloImagen.DeleteOnSubmit(item);
                        }
                    }
                }
            }

            database.SubmitChanges();

            return strResultado;
        }

        protected void gvImagenes_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    Imagen oImagen = null;

                    if (e.Row.DataItem is Imagen)
                    {
                        oImagen = (Imagen)(e.Row.DataItem);
                    }

                    CheckBox chkvisible = (CheckBox)(e.Row.FindControl("chkVisible"));
                    CheckBox chkdefecto = (CheckBox)(e.Row.FindControl("chkDefecto"));
                    Image imgImagen = (Image)(e.Row.FindControl("imgImagen"));

                    if (oImagen != null)
                    {
                        chkvisible.Visible = true;
                        chkdefecto.Visible = true;
                        chkvisible.Checked = oImagen.Visible == 'Y' ? true : false;
                        chkdefecto.Checked = oImagen.Defecto == 'Y' ? true : false;

                        imgImagen.ImageUrl = oImagen.Ruta;
                    }
                    else
                    {
                        chkvisible.Visible = false;
                        chkdefecto.Visible = false;
                        imgImagen.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
           
        }

        /// <summary>
        /// Llena los mensajes de error de las validaciones del formulario.
        /// </summary>
        private void EstablecerValidaciones()
        {
            if (gvImagenes.FooterRow != null)
            {
                RequiredFieldValidator reqDescripcionImagen = (RequiredFieldValidator)gvImagenes.FooterRow.FindControl("reqDescripcionImagen");
                reqDescripcionImagen.Text = Resources.MensajesValidacion.RequiredField;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("EstiloList.aspx");
        }       
    }

    [Serializable]
    public class Imagen
    {
        public int Id { get; set; }
        public int Secuencial { get; set; }
        public int EstiloId { get; set; }
        public string Descripcion { get; set; }
        public DateTime FechaRegistro { get; set; }
        public Char Defecto { get; set; }
        public Char Visible { get; set; }
        public string Ruta { get; set; }
    }
}